package io.legado.app

import androidx.room.Room
import androidx.room.migration.Migration
import androidx.room.testing.MigrationTestHelper
import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import io.legado.app.data.AppDatabase
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import java.io.IOException

@RunWith(AndroidJUnit4::class)
class MigrationTest {

    private val TEST_DB = "migration-test"

    private val ALL_MIGRATIONS = arrayOf<Migration>(

    )

    @get:Rule
    val helper: MigrationTestHelper = MigrationTestHelper(
        InstrumentationRegistry.getInstrumentation(),
        AppDatabase::class.java.canonicalName,
        FrameworkSQLiteOpenHelperFactory()
    )

    /**
     * 测试数据库迁移功能。
     * 该方法会创建一个最早的数据库版本，然后通过 Room 库应用所有迁移脚本，
     * 最终打开最新版本的数据库并验证其模式。
     *
     * @throws IOException 如果在创建或打开数据库时发生 I/O 错误
     */
    @Test
    @Throws(IOException::class)
    fun migrateAll() {
        // 创建最早的数据库版本
        // 这是为了从已知状态开始进行迁移测试
        helper.createDatabase(TEST_DB, 50).apply {
            close()
        }

        // 打开最新版本的数据库
        // Room 将在所有迁移执行后验证数据库模式
        Room.databaseBuilder(
            InstrumentationRegistry.getInstrumentation().targetContext,
            AppDatabase::class.java,
            TEST_DB
        ).addMigrations(*ALL_MIGRATIONS)
            .build().apply {
                openHelper.writableDatabase
                close()
            }
    }

}